/**
 * 
 */
package br.com.skynix.tcmc.controller.login;

import java.io.IOException;
import java.util.Arrays;

import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import javax.validation.constraints.Size;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Controller;

import br.com.skynix.tcmc.base.managedbeans.AbstractManagedBean;
import br.com.skynix.tcmc.model.seguranca.Usuario;
import br.com.skynix.tcmc.seguranca.ChaveAcesso;
import br.com.skynix.tcmc.seguranca.ControleAcesso;
import br.com.skynix.tcmc.service.seguranca.usuarios.UsuarioService;
import br.com.skynix.tcmc.util.WebUtil;

/**
 * @author mgrb
 * 
 */
@ManagedBean
@RequestScoped
@Controller
public class LoginMB extends AbstractManagedBean {

	@Size(min = 1)
	private String username;

	@Size(min = 1)
	private String password;

	@Resource
	private UsuarioService usuarioService;

	/**
	 * @return the username
	 */
	public String getUsername() {
		return username;
	}

	/**
	 * @param username the username to set
	 */
	public void setUsername(String username) {
		this.username = username;
	}

	/**
	 * @param password the password to set
	 */
	public void setPassword(String password) {
		this.password = password;
	}

	/**
	 * @return the password
	 */
	public String getPassword() {
		return password;
	}

	public String login() throws IOException {
		Usuario usuario = new Usuario();
		usuario.setUsername(StringUtils.trim(username));
		usuario.setPassword(password);
		if (usuarioService.isCredentialValid(usuario)) {
			FacesContext fc = FacesContext.getCurrentInstance();
			HttpSession session = (HttpSession) fc.getExternalContext()
					.getSession(false);
			usuario.setPassword(null);
			session.setAttribute(WebUtil.USER_UUID, usuarioService
					.buscarPeloExemplo(usuario).get(0));
			// FIXME Carregar funcionalidades do Banco de dados.
			session.setAttribute(
					WebUtil.USER_FUNCIONALIDADES,
					new ControleAcesso(Arrays.asList(ChaveAcesso.VENDAS_ROOT,
							ChaveAcesso.VENDAS_PEDIDOS,
							ChaveAcesso.VENDAS_ESPELHOS,
							ChaveAcesso.CADASTRO_ROOT,
							ChaveAcesso.CADASTRO_CLIENTES,
							ChaveAcesso.CADASTRO_PROSPECTS,
							ChaveAcesso.CADASTRO_CONCORRENTES,
							ChaveAcesso.CADASTRO_PARCEIROS,
							ChaveAcesso.CADASTRO_FORNECEDORES,
							ChaveAcesso.CADASTRO_CONTATOS, ChaveAcesso.RH_ROOT,
							ChaveAcesso.RH_EMPRESAS, ChaveAcesso.RH_EMPREGADOS,
							ChaveAcesso.FINANCAS_ROOT,
							ChaveAcesso.FINANCAS_LANCAMENTO_CONTAS,
							ChaveAcesso.FINANCAS_CONTAS_PAGAR,
							ChaveAcesso.FINANCAS_CONTAS_RECEBER,
							ChaveAcesso.FINANCAS_TRANSFERENCIA,
							ChaveAcesso.TELEMKT_ROOT,
							ChaveAcesso.TELEMKT_ATIVIDADES,
							ChaveAcesso.TELEMKT_CAMPANHAS,
							ChaveAcesso.TELEMKT_OPORTUNIDADES,
							ChaveAcesso.RELATORIO_ROOT,
							ChaveAcesso.RELATORIO_FINANCEIRO,
							ChaveAcesso.RELATORIO_CONTAS_PAGAR,
							ChaveAcesso.RELATORIO_CONTAS_RECEBER,
							ChaveAcesso.RELATORIO_EXTRATO_BANCARIO,
							ChaveAcesso.RELATORIO_FOLHA_PAGAMENTO,
							ChaveAcesso.CONF_ROOT, ChaveAcesso.CONF_RH_ROOT,
							ChaveAcesso.CONF_RH_ESTADO_CIVIL,
							ChaveAcesso.CONF_RH_TIPO_SANGUINEO,
							ChaveAcesso.CONF_RH_TIPO_AUSENCIA,
							ChaveAcesso.CONF_RH_CLASSE,
							ChaveAcesso.CONF_RH_CATEGORIA_FUNCIONARIO,
							ChaveAcesso.CONF_RH_POSICAO_FUNCIONARIO,
							ChaveAcesso.CONF_RH_CATEGORIA_FOLHA_PAGAMENTO,
							ChaveAcesso.CONF_FINANCEIRO_ROOT,
							ChaveAcesso.CONF_FINANCEIRO_BANCO,
							ChaveAcesso.CONF_FINANCEIRO_NATUREZA,
							ChaveAcesso.CONF_FINANCEIRO_CENTRO_CUSTO,
							ChaveAcesso.CONF_FINANCEIRO_OPERACAO,
							ChaveAcesso.CONF_FINANCEIRO_DESPESA,
							ChaveAcesso.CONF_FINANCEIRO_FORMA_PAGAMENTO,
							ChaveAcesso.CONF_FINANCEIRO_PORTADOR,
							ChaveAcesso.CONF_GERAL_ROOT,
							ChaveAcesso.CONF_GERAL_SETOR,
							ChaveAcesso.CONF_GERAL_ORIGEM_OPORTUNIDADE,
							ChaveAcesso.CONF_GERAL_TIPO_OPORTUNIDADE,
							ChaveAcesso.CONF_GERAL_FASE_OPORTUNIDADE,
							ChaveAcesso.CONF_GERAL_TIPO_CAMPANHA,
							ChaveAcesso.CONF_GERAL_STATUS_CAMPANHA,
							ChaveAcesso.CONF_GERAL_PAPEL_CONTATO,
							ChaveAcesso.CONF_GERAL_CLASSIFICACAO_CONTA,
							ChaveAcesso.CONF_SERVICO_ROOT,
							ChaveAcesso.CONF_SERVICO_MARCA_APARELHO,
							ChaveAcesso.CONF_SERVICO_TIPO_APARELHO,
							ChaveAcesso.CONF_SERVICO_TIPO_PLANO,
							ChaveAcesso.CONF_SERVICO_SERVICO,
							ChaveAcesso.CONF_SERVICO_APARELHO,
							ChaveAcesso.CONF_SERVICO_PLANO,
							ChaveAcesso.CONF_VENDA_ROOT,
							ChaveAcesso.CONF_VENDA_STATUS_VENDA,
							ChaveAcesso.CONF_VENDA_TIPO_VENDA,
							ChaveAcesso.CONF_ESPELHO_ROOT,
							ChaveAcesso.CONF_ESPELHO_TIPO_COMISSAO,
							ChaveAcesso.CONF_ESPELHO_DESCRICAO_ESPELHO,
							ChaveAcesso.SEGURANCA_ROOT,
							ChaveAcesso.SEGURANCA_USUARIO)));
			return formatPath("home/home_view");
		}
		else {
			adcionarMensagem(FacesMessage.SEVERITY_ERROR,
					"login.erro.user_pwd_invalido",
					"login.erro.user_pwd_invalido.detail", false);
		}
		return null;
	}

	public String logout() {
		FacesContext fc = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) fc.getExternalContext().getSession(
				false);
		session.invalidate();
		return formatPath("login/login_view");
	}
}
